﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.IO;

namespace PluginService.Common
{
    public static class Util
    {
        public static string GetWindowsServiceInstallPath(string ServiceName)
        {
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            string path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
            path = path.Replace("\"", string.Empty);
            return path;
        }

        public static List<byte>[] SplitArray(byte[] Source, int parts)
        {

            if (parts <= Source.Length)
            {

                try
                {

                    int totalNum = Source.Length;

                    int partNum = Convert.ToInt32(totalNum / parts);

                    int sourceIndex = 0;

                    int maxLength = totalNum - partNum * (parts - 1);

                    List<byte>[] tempArray = new List<byte>[parts];

                    for (int i = 0; i < parts; i++)
                    {

                        if (i < parts - 1)
                        {

                            byte[] destinArray = new byte[partNum];

                            tempArray[i] = new List<byte>(partNum);

                            Console.WriteLine("第" + i + "块：");

                            Array.Copy(Source, sourceIndex, destinArray, 0, partNum);





                            //将数组保存为链表

                            for (int j = 0; j < destinArray.Length; j++)
                            {

                                tempArray[i].Add(destinArray[j]);



                            }



                            List<byte> tempList = tempArray[i];

                            foreach (int temp_i in tempList)
                            {

                                Console.WriteLine(temp_i);

                            }



                            sourceIndex = sourceIndex + partNum;

                        }

                        else
                        {

                            byte[] destinArray = new byte[maxLength];

                            tempArray[i] = new List<byte>(maxLength);

                            Console.WriteLine("第" + i + "块：");

                            Array.Copy(Source, sourceIndex, destinArray, 0, maxLength);





                            for (int j = 0; j < destinArray.Length; j++)
                            {

                                tempArray[i].Add(destinArray[j]);



                            }



                            List<byte> tempList = tempArray[i];

                            foreach (int temp_i in tempList)
                            {

                                Console.WriteLine(temp_i);

                            }

                        }

                    }

                    return tempArray;

                }

                catch (IndexOutOfRangeException ex)
                {

                    //throw new Exception(ex.Message);

                    Console.WriteLine(ex.Message);

                    throw new Exception(ex.Message);

                }

            }

            else
            {

                Console.WriteLine("分块数不能大于总数");

                return null;

            }

        }

	    private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
	    /// <summary>
	    /// 创建GET方式的HTTP请求
	    /// </summary>
	    /// <param name="url">请求的URL</param>
	    /// <param name="timeout">请求的超时时间</param>
	    /// <param name="userAgent">请求的客户端浏览器信息，可以为空</param>
	    /// <param name="cookies">随同HTTP请求发送的Cookie信息，如果不需要身份验证可以为空</param>
	    /// <returns></returns>
	    public static HttpWebResponse CreateGetHttpResponse(string url,int? timeout, string userAgent,CookieCollection cookies)
	    {
	        if (string.IsNullOrEmpty(url))
	        {
	            throw new ArgumentNullException("url");
	        }
	        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
	        request.Method = "GET";
	        request.UserAgent = DefaultUserAgent;
	        if (!string.IsNullOrEmpty(userAgent))
	        {
	            request.UserAgent = userAgent;
	        }
	        if (timeout.HasValue)
	        {
	            request.Timeout = timeout.Value;
	        }
	        if (cookies != null)
	        {
	            request.CookieContainer = new CookieContainer();
	            request.CookieContainer.Add(cookies);
	        }
	        return request.GetResponse() as HttpWebResponse;
	    }
	    /// <summary>
	    /// 创建POST方式的HTTP请求
	    /// </summary>
	    /// <param name="url">请求的URL</param>
	    /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
	    /// <param name="timeout">请求的超时时间</param>
	    /// <param name="userAgent">请求的客户端浏览器信息，可以为空</param>
	    /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
	    /// <param name="cookies">随同HTTP请求发送的Cookie信息，如果不需要身份验证可以为空</param>
	    /// <returns></returns>
	    public static HttpWebResponse CreatePostHttpResponse(string url,IDictionary<string,string> parameters,int? timeout, string userAgent,Encoding requestEncoding,CookieCollection cookies)
	    {
	        if (string.IsNullOrEmpty(url))
	        {
	            throw new ArgumentNullException("url");
	        }
	        if(requestEncoding==null)
	        {
	            throw new ArgumentNullException("requestEncoding");
	        }
	        HttpWebRequest request=null;
	        //如果是发送HTTPS请求
	        if(url.StartsWith("https",StringComparison.OrdinalIgnoreCase))
	        {
	            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
	            request = WebRequest.Create(url) as HttpWebRequest;
	            request.ProtocolVersion=HttpVersion.Version10;
	        }
	        else
	        {
	            request = WebRequest.Create(url) as HttpWebRequest;
	        }
	        request.Method = "POST";
	        request.ContentType = "application/x-www-form-urlencoded";
	            
	        if (!string.IsNullOrEmpty(userAgent))
	        {
	            request.UserAgent = userAgent;
	        }
	        else
	        {
	            request.UserAgent = DefaultUserAgent;
	        }
	
	        if (timeout.HasValue)
	        {
	            request.Timeout = timeout.Value;
	        }
	        if (cookies != null)
	        {
	            request.CookieContainer = new CookieContainer();
	            request.CookieContainer.Add(cookies);
	        }
	        //如果需要POST数据
	        if(!(parameters==null||parameters.Count==0))
	        {
	            StringBuilder buffer = new StringBuilder();
	            int i = 0;
	            foreach (string key in parameters.Keys)
	            {
	                if (i > 0)
	                {
	                    buffer.AppendFormat("&{0}={1}", key, parameters[key]);
	                }
	                else
	                {
	                    buffer.AppendFormat("{0}={1}", key, parameters[key]);
	                }
	                i++;
	            }
	            byte[] data = requestEncoding.GetBytes(buffer.ToString());
	            using (Stream stream = request.GetRequestStream())
	            {
	                stream.Write(data, 0, data.Length);
	            }
	        }
	        return request.GetResponse() as HttpWebResponse;
	    }
	
	    private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
	    {
	        return true; //总是接受
	    }

        public static String GetJsonFromWeb(string url)
        {
            // Creates an HttpWebRequest with the specified URL. 
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            myHttpWebRequest.Method = "GET";
            myHttpWebRequest.Timeout = 100000;
            try
            {
                // Sends the HttpWebRequest and waits for the response.			
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                // Gets the stream associated with the response.
                Stream receiveStream = myHttpWebResponse.GetResponseStream();
                Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
                // Pipes the stream to a higher level stream reader with the required encoding format. 
                StreamReader readStream = new StreamReader(receiveStream, encode);
                Char[] read = new Char[256];
                // Reads 256 characters at a time.    
                int count = readStream.Read(read, 0, 256);
                StringBuilder stringBuilder = new StringBuilder();
                while (count > 0)
                {
                    // Dumps the 256 characters on a string and displays the string to the console.
                    String str = new String(read, 0, count);
                    stringBuilder.Append(str);
                    count = readStream.Read(read, 0, 256);
                }

                // Releases the resources of the response.
                myHttpWebResponse.Close();
                // Releases the resources of the Stream.
                readStream.Close();
                return stringBuilder.ToString();
            }
            catch (Exception e)
            {
                return null;
            }
            
          

            
        }
	   
	
    }
}
